package com.allenlee.mvphelper.util.encryption;

import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;

import com.allenlee.mvphelper.util.NativeHelper;

import java.nio.charset.StandardCharsets;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author : lifei
 * 创建时间： 19-12-11
 * 更改时间： 19-12-11
 * Email : allen.lee723@qq.com
 * @version :
 * Description： AES 加密方式
 */
public class AESHelper {

    static {
        System.loadLibrary("MHHelper");
    }

    // AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式
    private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";
    // AES 加密
    private static final String AES = "AES";

    /**
     * 使用默认密钥加密
     * @param cleartext 明文
     * @return 加密文本
     */
    public static String encrypt(String cleartext) {
        return encrypt(NativeHelper.getSecretKey(), cleartext);
    }

    /**
     * 加密
     * @param secretKey 密钥
     * @param cleartext 明文
     * @return 加密文本
     */
    public static String encrypt(String secretKey, String cleartext) {
        if (TextUtils.isEmpty(cleartext)) {
            return cleartext;
        }
        Log.d("AESHelper", "encrypt: secretKey = " + secretKey + ", iv = " + NativeHelper.getIv());

        try {
            IvParameterSpec zeroIv = new IvParameterSpec(NativeHelper.getIv().getBytes());
            // 创建 AES 秘钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), AES);
            // 创建密码器
            Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
            // 初始化加密器
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, zeroIv);
            // 执行加密
            byte[] result = cipher.doFinal(cleartext.getBytes(StandardCharsets.UTF_8));
            return new String(Base64.encode(result, Base64.DEFAULT));

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用默认密钥解密
     * @param encrypted 密文
     * @return 解密文本
     */
    public static String decrypt(String encrypted) {
        return decrypt(NativeHelper.getSecretKey(), encrypted);
    }

    /**
     * 解密
     * @param secretKey 密钥
     * @param encrypted 密文
     * @return 解密文本
     */
    public static String decrypt(String secretKey, String encrypted) {
        Log.d("AESHelper", "decrypt: secretKey = " + secretKey + ", iv = " + NativeHelper.getIv());
        try {
            byte[] byteEncrypted = Base64.decode(encrypted, Base64.DEFAULT);
            IvParameterSpec zeroIv = new IvParameterSpec(NativeHelper.getIv().getBytes());
            // 创建AES秘钥
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), AES);
            // 创建密码器
            Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
            // 初始化解密器
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
            // 解密
            byte[] decryptedData = cipher.doFinal(byteEncrypted);
            return new String(decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}